iT邦幫忙

2022 iThome 鐵人賽

DAY 12
0
Security

學習密碼學神祕名詞系列 第 12

訊息鑑別碼 MAC

  • 分享至 

  • xImage
  •  

介紹下一個攻擊前,要先介紹一下密碼雜湊函数 CHF一個常見的應用:訊息鑑別碼 Message Authentication Code**,簡稱 MAC。MAC 有一點像數位簽名,主要是來驗證訊息來源的身份。流程大樣是:

每次寄件人傳送訊息時,都需要附上一段 MAC 碼,以讓收件人確認是來自已知的人。

似乎有點抽象,我們可以用數個比喻,MAC 就像是:

  • 文件上的簽名
  • 存摺上的印章
  • 軍隊的兵符
  • 歐洲貴族信封的封蠟
  • 日月神教的黑木令牌

總之就是讓收件人一看就知道寄件人是誰或是可信任的來源。
https://ithelp.ithome.com.tw/upload/images/20220922/20141437c9ASiZZAcM.jpg

所以這個 MAC 僅是一個概念,可以有各種實現它的方式。而 MAC 演算法常是用雜湊 Hash 來實現,看到這裡總算扯上點關係了...。Wiki 上有一個 MAC 流程的圖,頗為經典:
https://ithelp.ithome.com.tw/upload/images/20220922/20141437k4fl9AT2sH.png

左方為「寄件人」,右方為「收件人」。寄件人要寄一封訊息(Message)給收件人。寄件人希望收件人有辦法確認訊息是他寄的,於是事先有交換一組暗號(Key)給收件人,接著 MAC 演算法會利用該暗號和訊息生成一組 MAC 碼,並一起與訊息寄出。收件人可自行再用同樣的方法將收到的訊息和他有的暗號生成 MAC 碼並比較兩個 MAC 碼是否相同。

Why?

至於為何 MAC 演算法是上述那樣?我們先重頭開始看 MAC 的目的,假設我們要想確認一段訊息的寄件人就是我所認識的人,簡單的方式就是有事先的約定。

方法1 - 約定一段暗號

假設我與其它人的暗號為:ji32k7au4a83 (常見的台灣密碼 xD)。我如果收到別人的訊息內附有 ji32k7au4a83,那我就知道是對方是可信任的了(?)

尷尬的地方是,有人看到我們的訊息後,即把暗號記下,然後傳錯誤的訊息及該暗號給我們。所以這方法無效。

方法2 - 約定一個 Hash Function

假設我與其它人的約定一個 Hash Function 為:MD5,然後每次訊息時,都加上 Digest。由於訊息可以產生一組獨特的 Digest,我即使附上 Digest 在訊息旁也無妨,因為每則訊息皆會產生不一樣的 Digest。旁人若不知道我們的 Hash Function 也無法用錯誤的訊息產生正確的 Digest。這樣我收到訊息後,就把訊息也用 MD5 的方法得到 Digest,比對無誤,那我就知道是對方是可信任的了(?)

立意良好,可惜常用 Hash Function 就那幾種,駭客隨便試幾個 MD5, SHA-1 等,馬上就知道約定的 Hash Function。如法炮制將錯誤的訊息傳給我。所以這方法無效。

方法3 - 把暗號和訊息丟進 Hash Function

不過,如果我們將(暗號+訊息)一起丟入 Hash Function ,再將 Digest 當 MAC 碼呢?

首先,由於每則訊息不同,每次的 Digest 皆會不同,故可以避免有心人士複製 MAC 碼,因為複製也沒用。再來,有心人士猜到 Hash Function 也沒有用,因為不知道暗號,無法生成正確的 Digest。以及當暗號越長,越可以抵擋彩虹表攻擊。此方法幾乎做到所有的防護,故 MAC 的流程才會變成方法3的形狀。

小結

MAC 碼可是十分有用,我們需要能驗證訊息來源,才能進一步在網路上做一些大膽的操作,比如:

  • 簽署文件 - 確定是本人簽的
  • 使用網銀 - 確定是本人提錢
  • 確定是喜愛的直播主親自傳送的溫暖訊息

不過我們若真的依照上面方法三提到的方式來實做 MAC ,可能會慘遭下一篇要提到的攻擊的受害者...[[Length extension attack]]

參考資料


上一篇
彩虹表攻擊 Rainbow Table Attack
系列文
學習密碼學神祕名詞12
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言